﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//using System.Diagnostics;
using System.Threading.Tasks;
using System.Threading;
//using System.Windows.Forms;

namespace decode
{
    public class Cl_decode
    {
        /// <summary>
        /// Clé utilisé pour le décriptage
        /// </summary>
        public int cle { get; set; }
        /// <summary>
        /// text décodé
        /// </summary>
        public string text { get; set; }
        /// <summary>
        /// Pourcentage de mot présent dans le dico
        /// </summary>
        public float pourcent { get; set; }
        /// <summary>
        /// text à decoder
        /// </summary>
        public string enchantillon { get; set; }

        private List<Cl_resultLangue> resultLangues = new List<Cl_resultLangue>(0);

        private string langue;

        public string seconde { get; set; }

        /// <summary>
        /// Decode l'échatillon
        /// </summary>
        /// <param name="depart">indique a partir d'ou la clé commence</param>
        /// <returns>le pourcentage de fiabilité</returns>
        public float decoder()
        {

            foreach (char c in this.enchantillon)
            {
                this.text += decripter(c);
               
            }
            if (this.langue != null)
            {
                calculerPourcentages();
            }
            return pourcent;
        }


        public string cesar(char code, int decalage)
        {

            string alphabet = "abcdefghijklmnopqrstuvwxyz";
            if (decalage < alphabet.Length)
            {
                int index = alphabet.IndexOf(code);
                if (index > 0)
                {
                    int apDecalage = index + decalage;
                    if (apDecalage > alphabet.Length)
                    {
                        int nvIndex = apDecalage - alphabet.Length;
                        return alphabet[nvIndex].ToString();
                    }
                    else
                    {
                        return alphabet[apDecalage].ToString();
                    }

                }

                return code.ToString();
            }
            return code.ToString();

        }


        /// <summary>
        /// Réalise le XOR entre le char et la clé
        /// </summary>
        /// <param name="code">char à decoder</param>
        /// <param name="position">curseur de la clé</param>
        /// <returns>char decodé</returns>
        private string decripter(char code)
        {
            
            int lettre = Convert.ToInt32(code);
            int result = lettre ^ this.cle;
            try
            {
                return char.ConvertFromUtf32(result);
            }
            catch
            {
                return "_";
            }
           
        }

        /// <summary>
        /// Calcul le pourcentage de mot présent dans le dico
        /// puis modifie la valeur de pourcentage
        /// </summary>
        private void calculerPourcentages()
        {

            if (langue == "all")
            {
                foreach (Cl_dico dico in WebService.webDecode.dicos)
                {
                    Cl_resultLangue result = new Cl_resultLangue();
                    result.langue = dico.langue;
                    resultLangues.Add(result);
                }

                Parallel.ForEach(resultLangues, (result) =>
                {
                    result.pourcentage = this.calculerPourcentage(result.langue);
                });

                Cl_resultLangue meilleur =  resultLangues.OrderByDescending((y) => y.pourcentage).FirstOrDefault();

                this.pourcent = meilleur.pourcentage;
                this.langue = meilleur.langue;
                

            }
            else //#########################################
            {
                pourcent = calculerPourcentage(langue);                
            }

        }


        private float calculerPourcentage(string languePara)
        {
            //float nbMot = this.text.Length;
            //float nbMotDansLeDico = 0;

            //string alphabet = "abcdefghijklmnopqrstuvwxyz";

            //foreach (char lettre in text)
            //{
            //    if (alphabet.Contains(lettre))
            //    {
            //        nbMotDansLeDico++;
            //    }
            //}

            //float div = nbMotDansLeDico / nbMot;
            ////if (nbMotDansLeDico != 0)
            ////{
            ////    Debug.WriteLine("##############" + nbMotDansLeDico);
            ////}

            //return div * 100;

            string[] mots = this.text.Split(new Char[] { ' ', ',', ';', ':', '\t', '\n', '!', '?', '/', '"', '\'', '.' });
            float nbMot = mots.Length;
            float nbMotDansLeDico = 0;

            int index = WebService.webDecode.dicos.FindIndex((x) => x.langue == languePara);
            if (index >= 0)
            {



                foreach (string mot in mots)
                {

                    if (WebService.webDecode.dicos[index].dico.Contains(mot))
                    {
                        nbMotDansLeDico++;
                    }
                }
                float div = nbMotDansLeDico / nbMot;

                return div * 100;
            }
            else
            {
                //MessageBox.Show("La langue n'existe pas. ");
                return 0;
            }
        }




        /// <summary>
        /// Constructeur
        /// </summary>
        /// <param name="clePara">clé à utiliser</param>
        /// <param name="echantillonPara">texte à décoder</param>
        /// <param name="languePara">langue à utiliser si null pas de recherche dans le dico</param>
        public Cl_decode(int clePara, string echantillonPara, string languePara)
        {
            this.cle = clePara;
            this.enchantillon = echantillonPara;
            this.langue = languePara;
        }
        public Cl_decode()
        {

        }





        

        public string ToString()
        {
            return "############ " + this.enchantillon + " donne retour: " + this.text + " avec la clé " + this.cle + "pourcentage " + this.pourcent;
        }
    }
}